Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [c] creazione socket sotto linux
Forum - C/C++ - [c] creazione socket sotto linux

Avatar
Leonhearth (Normal User)
Newbie


Messaggi: 11
Iscritto: 06/07/2010

Segnala al moderatore
Postato alle 14:24
Sabato, 04/02/2012
Salve ragazzi ho un problema,  in pratica quando vado ad avviare client e server sembra andare tutto bene quando digito però una scelta dal client me la fa vedere e dp se voglio fare altro si blocca e mi dice che c'è un errore sulla bind ..mi sapete dire il perchè? C'è qualcosa di errato nella creazione del server? Ecco il codice relativo alla creazione della socket :

Codice sorgente - presumibilmente C#

  1. [CODE]
  2.  
  3. void crea_socket()
  4. {
  5. int listenfd, connfd,ls_result,prezzo_prodotto_scelto,scelta_effettuata, acquisto;
  6. struct sockaddr_in servaddr;
  7. socklen_t sin_size;
  8. short port;
  9.  
  10.  
  11. listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  12.  
  13.  
  14. if (listenfd < 0)
  15. printf("Server: errore nella creazione della socket.\n");
  16. else
  17. printf("La Listening Socket e' partita\n");
  18.  
  19.  
  20. port=4000;
  21.  
  22.  
  23. servaddr.sin_family = AF_INET;
  24. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  25. servaddr.sin_port = htons(port);
  26.  
  27. if (bind(listenfd,(struct sockaddr *) &servaddr, sizeof(struct sockaddr_in)) < 0)
  28. printf("Server: errore durante la bind.\n"); //Rilevamento dell'eventuale errore durante la bind
  29.  
  30. ls_result = listen(listenfd, SOMAXCONN);
  31.  
  32. if (ls_result < 0)
  33. printf("Server: errore durante la listen.\n"); //La listen non è riuscita
  34. else
  35. printf("La Socket e' in Ascolto\n");
  36.  
  37. sin_size = sizeof(struct sockaddr_in);
  38.  
  39. acquisto = 0;
  40.  
  41. connfd = accept(listenfd, (struct sockaddr*) &servaddr, &sin_size);
  42.  
  43. recv(connfd, (char *)&scelta_effettuata, sizeof(int), 0);
  44.  
  45. printf("Messaggio Arrivato: %d \n", scelta_effettuata);
  46. prezzo_prodotto_scelto = 0;
  47.  
  48. if (scelta_effettuata == 1)
  49. invia_prodotti (connfd, acquisto);
  50.  
  51. if (scelta_effettuata == 2)
  52. invia_prod_da_prenotare (connfd, acquisto, prezzo_prodotto_scelto);
  53.  
  54. if (scelta_effettuata == 3)
  55. {
  56. acquisto = 1;
  57. invia_prodotti (connfd, acquisto);
  58. }
  59.  
  60. }
  61. [/CODE]


Ultima modifica effettuata da Leonhearth il 04/02/2012 alle 14:25
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:28
Sabato, 04/02/2012
1. Spiega meglio il problema.
2. Includi tutto il codice.
3. Mostra un esempio di output.


Il mio blog: https://piero.dev
PM Quote
Avatar
Leonhearth (Normal User)
Newbie


Messaggi: 11
Iscritto: 06/07/2010

Segnala al moderatore
Postato alle 22:12
Sabato, 04/02/2012
il fatto è che quando avvio client e server va tutto bene poi effettuo una scelta fra le 4 proposte ad es. inserisco 1 cioè voglio vedere la lista dei prodotti e me la fa vedere, dopodichè il client ritorna alla scelta però quando vado a digitare tipo 2 non fa + nulla e dal lato server mi dice che c'è stato un errore con la bind..
Se lo testate si capisce ancora meglio.

SERVER:

Codice sorgente - presumibilmente C

  1. #include <stdio.h>
  2.  
  3. #include <stdlib.h>
  4.  
  5. #include <unistd.h>
  6.  
  7. #include <sys/types.h>
  8.  
  9. #include <sys/socket.h>
  10.  
  11. #include <arpa/inet.h>
  12.  
  13. #include <string.h>
  14.  
  15.  
  16.  
  17. void crea_socket();
  18.  
  19. void invia_prodotti(int remoteSocket, int acquisto);
  20.  
  21. void invia_prod_da_prenotare(int remoteSocket, int acquisto, double prezzo_prodotto_scelto);
  22.  
  23.  
  24.  
  25.  
  26.  
  27. int main()
  28.  
  29. {
  30.  
  31. crea_socket();
  32.  
  33. return 0;
  34.  
  35. }
  36.  
  37.  
  38. void crea_socket()
  39.  
  40. {
  41.  
  42. int listenSocket; //Creazione della socket di ascolto
  43.  
  44. int remoteSocket; //Creazione della socket di ricezione
  45.  
  46.  
  47.  
  48. struct sockaddr_in Server_addr, Client_addr;
  49. int scelta_effettuata, acquisto;
  50.  
  51.  
  52. short port;
  53. int ls_result, prezzo_prodotto_scelto;
  54.  
  55. socklen_t len;
  56.  
  57. listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  58.  
  59.  
  60. if (listenSocket < 0)
  61.  
  62. printf("Server: errore nella creazione della socket.\n");
  63.  
  64. else
  65.  
  66. printf("La Listening Socket e' partita\n");
  67.  
  68.  
  69.  
  70.  
  71. port = 4000;
  72.  
  73.  
  74.  
  75. memset((void *)&Server_addr, 0, sizeof(Server_addr));
  76.  
  77.  
  78. Server_addr.sin_family = AF_INET;
  79.  
  80. Server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  81.  
  82.  
  83. Server_addr.sin_port = htons(port);
  84.  
  85.  
  86.  
  87. if (bind(listenSocket,(struct sockaddr*)&Server_addr,sizeof(Server_addr)) < 0)
  88.  
  89. printf("Server: errore durante la bind.\n");
  90.  
  91.  
  92.  
  93. ls_result = listen(listenSocket, SOMAXCONN);
  94.  
  95.  
  96. if (ls_result < 0)
  97.  
  98. printf("Server: errore durante la listen.\n");
  99. else
  100.  
  101. printf("La Socket e' in Ascolto\n");
  102.  
  103.  
  104.  
  105.  
  106. len = sizeof(Client_addr);
  107.  
  108.  
  109. acquisto = 0;
  110.  
  111.  
  112.  
  113. if((remoteSocket = accept(listenSocket,(struct sockaddr*)&Client_addr, &len))<0){
  114.  
  115. perror("accept");
  116.  
  117. exit(1);}
  118.  
  119.  
  120.  
  121.  
  122.  
  123. printf("Accettata Connessione con Client: %s\n",inet_ntoa(Client_addr.sin_addr));
  124.  
  125.  
  126.  
  127.  
  128.  
  129. recv(remoteSocket, (char *)&scelta_effettuata, sizeof(int), 0);
  130.  
  131.  
  132. printf("Messaggio Arrivato: %d \n", scelta_effettuata);
  133.  
  134. prezzo_prodotto_scelto = 0;
  135.  
  136.  
  137.  
  138. if (scelta_effettuata == 1)
  139. invia_prodotti (remoteSocket, acquisto);
  140.  
  141.  
  142.  
  143. if (scelta_effettuata == 2)
  144.  
  145. invia_prod_da_prenotare (remoteSocket, acquisto, prezzo_prodotto_scelto);
  146.  
  147.  
  148.  
  149. if (scelta_effettuata == 3)
  150.  
  151. {
  152.  
  153. acquisto = 1;
  154.  
  155. invia_prodotti (remoteSocket, acquisto);
  156.  
  157. }
  158.  
  159.  
  160.  
  161. }
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169. void invia_prodotti (int remoteSocket, int acquisto)
  170.  
  171. {
  172.  
  173. int i, prodotto_scelto;
  174.  
  175. double prezzo_prodotto_scelto;
  176.  
  177. char prodotti [6][50] = {"01. Frigorifero \t\t\t100,00 Euro\n", "02. Lavatrice \t\t125,10 Euro\n", "03. Forno \t\t\t\t56,50 Euro\n",
  178.  
  179. "04. Frullatore \t\t\t\t19,90 Euro\n", "05. Asciugatrice \t\t150,00 Euro\n", "06. Lavastoviglie \t\t\t120,50 Euro\n"};
  180.  
  181. double prezzi_prodotti [] = {100.00, 125.10, 56.50, 19.90, 150.00, 120.50};
  182.  
  183.  
  184.  
  185. printf ("Sto inviando:\n");
  186.  
  187.  
  188.  
  189. for (i=0; i<6; i++)
  190. {
  191.  
  192. send(remoteSocket, prodotti[i], strlen(prodotti[i]),0);
  193.  
  194.  
  195.  
  196. printf ("%s", prodotti[i]);
  197. }
  198.  
  199.  
  200.  
  201. if (acquisto == 0)
  202. {
  203.  
  204. printf("Chiudo il Server\n");
  205.  
  206. close(remoteSocket);
  207.  
  208.  
  209. crea_socket ();
  210. }
  211.  
  212.  
  213.  
  214. if (acquisto == 1) //In questo caso l'utente vuole effettuare l'acquisto
  215.  
  216. {
  217.  
  218. printf ("Aspetto il codice prodotto.\n");
  219.  
  220. recv (remoteSocket, (char *)&prodotto_scelto, sizeof(int), 0);
  221.  
  222.  
  223.  
  224. printf ("Ho ricevuto il codice prodotto %d\n", prodotto_scelto);
  225.  
  226. printf ("Sto inviando:\n");
  227.  
  228. send(remoteSocket,prodotti[prodotto_scelto-1], strlen(prodotti[prodotto_scelto-1]),0);
  229.  
  230.  
  231.  
  232.  
  233. printf ("%s", prodotti[prodotto_scelto-1]);
  234.  
  235. prezzo_prodotto_scelto= prezzi_prodotti[prodotto_scelto-1];
  236.  
  237.  
  238.  
  239. invia_prod_da_prenotare (remoteSocket, acquisto, prezzo_prodotto_scelto);
  240.  
  241.  
  242. }
  243.  
  244. }
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252. void invia_prod_da_prenotare (int remoteSocket, int acquisto, double prezzo_prodotto_scelto)
  253.  
  254.  
  255. {
  256.  
  257. int i, prod_da_prenotare_scelto;
  258.  
  259.  
  260.  
  261. char prod_da_prenotare [4][50] = {"01. Telefono wireless \t\t\t25,00 Euro\n", "02. Tv 32p HD \t\t\t200,00 Euro\n",
  262.  
  263. "03. Lettore Blu-ray \t\t\t99,90 Euro\n", "04. I-Phone 4S \t\t\t599,90 Euro\n"};
  264.  
  265. double prezzi_prod_da_prenotare [] = {25.00, 200.00, 99.90, 599.90};
  266.  
  267. double prezzo_prod_da_prenotare_scelto=0;
  268.  
  269.  
  270.  
  271. printf ("Sto inviando:\n");
  272.  
  273.  
  274.  
  275. for (i=0; i<4; i++)
  276. {
  277.  
  278. send(remoteSocket, prod_da_prenotare[i], strlen(prod_da_prenotare[i]),0);
  279.  
  280.  
  281.  
  282. printf ("%s", prod_da_prenotare[i]);
  283.  
  284. }
  285.  
  286.  
  287.  
  288. if (acquisto == 0)
  289. {
  290.  
  291. printf("Chiudo il Server\n");
  292.  
  293. close(remoteSocket);
  294.  
  295.  
  296.  
  297.  
  298. crea_socket ();
  299.  
  300. }
  301.  
  302.  
  303.  
  304. if (acquisto == 1)
  305. {
  306.  
  307. printf ("Aspetto il codice del prodotto da prenotare.\n");
  308.  
  309. recv (remoteSocket, (char *)&prod_da_prenotare_scelto, sizeof(int), 0);
  310.  
  311.  
  312.  
  313. printf ("Ho ricevuto il codice del prodotto da prenotare %d\n", prod_da_prenotare_scelto);
  314.  
  315. printf ("Sto inviando:\n");
  316.  
  317. send(remoteSocket, prod_da_prenotare[prod_da_prenotare_scelto-1], strlen(prod_da_prenotare[prod_da_prenotare_scelto-1]), 0);
  318.  
  319.  
  320.  
  321. printf ("%s", prod_da_prenotare[prod_da_prenotare_scelto-1]);
  322.  
  323.  
  324.  
  325. prezzo_prod_da_prenotare_scelto = prezzi_prod_da_prenotare[prod_da_prenotare_scelto-1] + prezzo_prodotto_scelto;
  326.  
  327.  
  328. send(remoteSocket, (char *)&prezzo_prod_da_prenotare_scelto, sizeof(double),0);
  329.  
  330.  
  331.  
  332. printf ("Invio al client la somma di %.2f e %.2f che fa %.2f\n", prezzi_prod_da_prenotare[prod_da_prenotare_scelto-1], prezzo_prodotto_scelto, prezzo_prod_da_prenotare_scelto);
  333.  
  334.  
  335.  
  336.  
  337.  
  338. printf("Chiudo il Server\n");
  339.  
  340. close(remoteSocket);
  341.  
  342.  
  343.  
  344. crea_socket ();
  345.  
  346. }
  347.  
  348. }




CLIENT:

codice:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. #include <stdlib.h>
  4.  
  5. #include <unistd.h>
  6.  
  7. #include <sys/types.h>
  8.  
  9. #include <sys/socket.h>
  10.  
  11. #include <arpa/inet.h>
  12.  
  13. #include <string.h>
  14.  
  15. #define PAUSE (getchar())
  16.  
  17.  
  18.  
  19. void stampa_inizio ();
  20.  
  21. void scelta ();
  22.  
  23. void elenco_prodotti (int scelta, int acquisto);
  24.  
  25. void elenco_prod_da_prenotare (int scelta);
  26.  
  27. void acquisto_prodotti_e_prod_da_prenotare (int clientsocket);
  28.  
  29. void elenco_prodotti_da_prenotare_acquisto (int clientsocket);
  30.  
  31.  
  32.  
  33.  
  34.  
  35. int main()
  36.  
  37. {
  38.  
  39. stampa_inizio ();
  40.  
  41. return 0;
  42.  
  43. }
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51. void stampa_inizio ()
  52.  
  53. //Void function che stampa a video il menù principale
  54.  
  55. {
  56.  
  57. printf ("Gestione rapporto Rivenditore/Grossista \n\n");
  58.  
  59. printf ("\t\t\t SCELTE EFFETTUABILI:\n");
  60.  
  61. printf (" 1. Visualizza prodotti\n 2. Visualizza prodotti da prenotare\n 3. Acquista/Prenota prodotto\n 4. Esci\n\n");
  62.  
  63. printf ("Scegliere una fra le opzioni rese disponibili: ");
  64.  
  65. scelta ();
  66. }
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74. void scelta ()
  75.  
  76. {
  77.  
  78. int scelta, acquisto;
  79.  
  80. acquisto = 0;
  81.  
  82. scanf ("%d", &scelta);
  83.  
  84. while ((scelta <1) || (scelta>4))
  85.  
  86. {
  87.  
  88. scelta = 0;
  89.  
  90. printf ("Hai digitato un valore non valido. Riprova scegliendo fra i 4 volri disponibili.\n");
  91.  
  92. printf ("Scegliere una fra le opzioni rese disponibili: ");
  93.  
  94. scanf ("%d", &scelta);
  95.  
  96. }
  97.  
  98.  
  99.  
  100. if (scelta == 1)
  101. elenco_prodotti (scelta, acquisto);
  102.  
  103. if (scelta == 2)
  104. elenco_prod_da_prenotare (scelta);
  105.  
  106. if (scelta == 3)
  107.  
  108. {
  109.  
  110. acquisto = 1;
  111.  
  112. elenco_prodotti (scelta, acquisto);
  113.  
  114. }
  115. }
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123. void elenco_prodotti (int scelta, int acquisto)
  124.  
  125. {
  126.  
  127. int clientsocket;
  128.  
  129. struct sockaddr_in addr;
  130.  
  131.  
  132. int i, p;
  133.  
  134. short port;
  135. char prodotti [100];
  136. port = 4000;
  137.  
  138. memset((void *)&addr, 0, sizeof(addr));
  139.  
  140. addr.sin_family = AF_INET;
  141. addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  142.  
  143. addr.sin_port = htons(port);
  144.  
  145. clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  146.  
  147. if (connect(clientsocket, (struct sockaddr*)&addr, sizeof(addr)) < 0)
  148.  
  149. printf("Errore nella connessione con il Server");
  150.  
  151. send(clientsocket,(char *)&scelta, sizeof(int),0);
  152.  
  153. for (i=0; i<6; i++)
  154. {
  155.  
  156. p = recv (clientsocket, prodotti, 100,0);
  157.  
  158. prodotti[p]='\0';
  159. printf ("%s", prodotti);
  160. }
  161.  
  162. if (acquisto == 0)
  163. {
  164.  
  165. PAUSE;
  166.  
  167. system ("clear");
  168.  
  169. stampa_inizio();
  170.  
  171. }
  172.  
  173. else
  174. acquisto_prodotti_e_prod_da_prenotare (clientsocket);
  175.  
  176. }
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184. void elenco_prod_da_prenotare (int scelta)
  185.  
  186. {
  187.  
  188. int clientsocket;
  189. struct sockaddr_in addr;
  190. int i, p;
  191. short port;
  192. char prod_da_prenotare [100];
  193. port = 4000;
  194.  
  195. memset((void *)&addr, 0, sizeof(addr));
  196.  
  197. addr.sin_family = AF_INET;
  198.  
  199. addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  200.  
  201. addr.sin_port = htons(port);
  202.  
  203. clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  204.  
  205. if (connect(clientsocket, (struct sockaddr*)&addr, sizeof(addr)) < 0)
  206.  
  207. printf("Errore nella connessione con il Server");
  208.  
  209.  
  210. send(clientsocket,(char *)&scelta, sizeof(int),0);
  211.  
  212. for (i=0; i<4; i++)
  213.  
  214. {
  215.  
  216. p = recv (clientsocket, prod_da_prenotare, 100,0);
  217.  
  218. prod_da_prenotare[p]='\0';
  219.  
  220. printf ("%s", prod_da_prenotare);
  221. }
  222.  
  223. PAUSE;
  224.  
  225. system ("clear");
  226. stampa_inizio();
  227.  
  228. }
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236. void elenco_prodotti_da_prenotare_acquisto (int clientsocket)
  237. {
  238.  
  239. int i, p;
  240.  
  241. char prod_da_prenotare [100];
  242.  
  243.  
  244.  
  245. for (i=0; i<4; i++)
  246. {
  247.  
  248. p = recv (clientsocket, prod_da_prenotare, 100,0);
  249.  
  250. prod_da_prenotare[p]='\0';
  251.  
  252. printf ("%s", prod_da_prenotare);
  253. }
  254.  
  255. }
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263. void acquisto_prodotti_e_prod_da_prenotare (int clientsocket)
  264.  
  265. {
  266.  
  267. int cod_prodotto, cod_prod_da_prenotare, p;
  268.  
  269. double totale;
  270. char prodotto_scelto [50];
  271. char prod_da_prenotare_scelto [50];
  272.  
  273.  
  274. totale = 0;
  275.  
  276.  
  277.  
  278. printf ("--> Inserire il codice del prodotto desiderato: ");
  279.  
  280. scanf ("%d", &cod_prodotto);
  281.  
  282.  
  283.  
  284. while ((cod_prodotto < 1) || (cod_prodotto> 6))
  285.  
  286. {
  287.  
  288. cod_prodotto = 0;
  289.  
  290. printf ("Codice errato. Riprova.\n");
  291.  
  292. printf ("--> Inserire il codice del prodotto desiderato: ");
  293.  
  294. scanf ("%d", &cod_prodotto);
  295.  
  296. }
  297.  
  298.  
  299.  
  300. send(clientsocket,(char *)&cod_prodotto, sizeof(int),0);
  301.  
  302. p = recv (clientsocket, prodotto_scelto, 50,0);
  303.  
  304. prodotto_scelto[p]='\0';
  305.  
  306. printf ("%s\n", prodotto_scelto); //Stampo a video la stringa
  307.  
  308. elenco_prodotti_da_prenotare_acquisto (clientsocket);
  309.  
  310.  
  311. printf ("--> Inserire il codice del prodotto da prenotare desiderato: ");
  312.  
  313. scanf ("%d", &cod_prod_da_prenotare);
  314.  
  315.  
  316.  
  317. while ((cod_prod_da_prenotare < 1) || (cod_prod_da_prenotare> 4))
  318.  
  319. {
  320.  
  321. cod_prod_da_prenotare = 0;
  322.  
  323. printf ("Codice errato. Riprova.\n");
  324.  
  325. printf ("--> Inserire il codice del prodotto da prenotare desiderato: ");
  326.  
  327. scanf ("%d", &cod_prod_da_prenotare);
  328.  
  329. }
  330.  
  331.  
  332.  
  333. send(clientsocket,(char *)&cod_prod_da_prenotare, sizeof(int),0);
  334.  
  335.  
  336. p = recv (clientsocket, prod_da_prenotare_scelto, 50,0);
  337.  
  338. prod_da_prenotare_scelto[p]='\0';
  339.  
  340. printf ("%s\n", prod_da_prenotare_scelto);
  341.  
  342.  
  343. recv (clientsocket, (char *)&totale, sizeof(double), 0);
  344.  
  345.  
  346. printf ("ACQUISTI:\nProdotto: %s\nProdotto prenotato: %s\nTotale: %.2f Euro\n", prodotto_scelto, prod_da_prenotare_scelto, totale);
  347.  
  348. PAUSE;
  349.  
  350. system ("clear");
  351.  
  352.  
  353.  
  354. stampa_inizio();
  355.  
  356. }




PM Quote
Avatar
Leonhearth (Normal User)
Newbie


Messaggi: 11
Iscritto: 06/07/2010

Segnala al moderatore
Postato alle 16:38
Lunedì, 06/02/2012
raga nessuno può aiutarmi? scusate per l'up

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:40
Lunedì, 06/02/2012
Ma nel client perche' apri una nuova connessione per ogni operazione? Una socket (una sola) dovrebbe essere aperta all'inizio del programma, dopodiche' dovresti riutirlizzarla per ogni futura operazione... il problema e' probabilmente causato da questo errore. Dichiara clientsocket come globale e utilizzala durante il programma senza aprire socket extra (oppure passala come argomento alle funzioni).


Il mio blog: https://piero.dev
PM Quote